home *** CD-ROM | disk | FTP | other *** search
/ Trading on the Edge / Trading On The Edge - CD-ROM Toolkit (Wayzata Technology)(2031)(1994).bin / pc / pc_files / venddemo / backprop / nnrexpl.c < prev    next >
C/C++ Source or Header  |  1993-06-08  |  6KB  |  180 lines

  1. /* nnrexpl - rank the % importance of input PEs using Explain output.     */
  2. /* assumptions: - no input data is logged in the *.nnr file               */
  3. /*              - there are no headers in the *.nnr file                  */
  4. /*              - the *.nnr file is NOT appended to                       */
  5. /*  note: accurate results require that the Explain function be run on    */
  6. /*        a file containing all training and testing data sets.           */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <math.h>
  12.  
  13. #define MAXLINELEN 1024*5        /* longest line read from *.nnr file */
  14. /* #define NUMINS  4 */              /* number of input PEs; avoids prompting */
  15.  
  16. main(argc, argv)
  17. int argc;
  18. char **argv;
  19. {
  20.    FILE *f1, *f2;
  21.    char inputLine[MAXLINELEN];
  22.    char filename[100];           /* input filename */
  23.    int fieldCount;               /* number of fields per data case in nnr file */
  24.    float *column;                /* pointer to dynamic memory (column totals) */
  25.    float grandTotal;             /* total of column totals */
  26.    float subTotal;               /* for nets with multiple output PEs */
  27.    long tmp;
  28.    int  numIns;                  /* inputs for this net (user specified) */
  29.    int  numOuts;                 /* outputs for this net (fieldcount/numIns) */
  30.    int  i, j;
  31.  
  32. /* open i/o files */
  33.    if (argc == 2)
  34.       strcpy (filename, argv[1]);
  35.    else
  36.    {
  37.       printf ("Enter the *.nnr results filename... ");
  38.       gets (filename);
  39.    }
  40.  
  41.    i = strlen (filename);
  42.    for (j = 0; filename[j] != '.' && j < i; j++);  /* locate period */
  43.    if (j == i)
  44.       strcat (filename, ".nnr");   /* default the extension */
  45.    if ( (f1 = fopen (filename, "r")) == (FILE *)0)
  46.    {
  47.       printf ("Cannot open input file '%s', aborting.\n", filename);
  48.       exit (1);
  49.    }
  50.    if ( (f2 = fopen ("nnrexpl.out", "w")) == (FILE *)0)
  51.    {
  52.       printf ("Cannot open output file 'nnrexpl.out', aborting.\n");
  53.       exit (1);
  54.    }
  55.  
  56. /* prompt for the number of input PEs in this data */
  57. #ifdef NUMINS
  58.    numIns = NUMINS;
  59. #else
  60.    numIns = 0;
  61.    printf ("Enter the number of input PEs in this network... ");
  62.    while (1)
  63.    {
  64.       gets (inputLine);
  65.       numIns = atoi (inputLine);
  66.       if (numIns != 0)
  67.          break;
  68.       printf ("Invalid entry; please re-enter the number of input PEs... ");
  69.    }
  70. #endif
  71.  
  72. /* find the first input record */
  73.    fgets (inputLine, MAXLINELEN, f1);
  74.    if (inputLine[0] == '\n')
  75.       fgets (inputLine, MAXLINELEN, f1);
  76.  
  77. /* count the number of fields in the first record */
  78.    fieldCount = 0;
  79.    for (tmp = 0; inputLine[tmp] != '\0'; tmp++)
  80.       if (inputLine[tmp] > 0x20 && inputLine[tmp+1] <= 0x20)
  81.         fieldCount++;
  82.    numOuts = fieldCount / numIns;
  83.    if (numIns * numOuts != fieldCount)
  84.    {
  85.       printf ("Error reading data file, or incorrect number of input PEs specified. \n");
  86.       printf ("%d inputs is not a multiple of %d fields detected in data; aborting.\n", numIns, fieldCount);
  87.       exit (1);
  88.    }
  89.  
  90. /* allocate memory for the accumulation and init the array */
  91.    column = NULL;
  92.    column = (float *)calloc (fieldCount, sizeof(float));  /* array of column outputs from 1 data case */
  93.    if (column == NULL)
  94.    {
  95.       printf ("Insufficient memory to check results; aborting.");
  96.       fclose (f1);
  97.       exit (1);
  98.    }
  99.    for (i=0; i < fieldCount; i++)
  100.       column[i] = 0.0;
  101.  
  102.  
  103. /* accumulate the values */
  104.    while (1)
  105.    {
  106.       tmp = 0;
  107.       for (i=0; i != fieldCount; i++)
  108.       {
  109.          while (inputLine[tmp] <= 0x20)
  110.              tmp++;
  111.          grandTotal = 0.0;
  112.          sscanf(&inputLine[tmp], "%f", &grandTotal);
  113.          column[i] += fabs(grandTotal);
  114.          while (inputLine[tmp] > 0x20)
  115.             tmp++;
  116.       }
  117.  
  118. /* read the next data case */
  119.       if (fgets (inputLine, MAXLINELEN, f1) == 0)
  120.          break;                                       /* eof */
  121.       if (inputLine[0] == '\n')
  122.          fgets (inputLine, MAXLINELEN, f1);
  123.  
  124.    }  /* end while */
  125.    fclose (f1);
  126.  
  127. /* calculate the grand total */
  128.    grandTotal = 0.0;
  129.    for (i=0; i != fieldCount; i++)
  130.       grandTotal += column[i];  /* total of all column totals */
  131.  
  132. /* display and log results */
  133. /* pass 1.. rank by number of inputs */
  134.    subTotal = 0.0;
  135.    printf ("\nExplain Summary for %s, %d input and %d output PEs.\n", filename, numIns, numOuts);
  136.    printf ("relative overall importance of input variables...\n");
  137.    fprintf (f2, "relative overall importance of input variables...\n");
  138.    for (i=0; i < fieldCount; i++)
  139.    {
  140.       if ( (i+1) % numOuts == 0)
  141.       {
  142.          subTotal += column[i];
  143.          printf ("   input%4d %6.0f %6.1f%%\n",
  144.                 (int)(i/numOuts+1), subTotal, (subTotal/grandTotal)*100.0);
  145.          fprintf (f2, "   input%4d %6.0f %6.1f%%\n",
  146.                 (int)(i/numOuts+1), subTotal, (subTotal/grandTotal)*100.0);
  147.          subTotal = 0.0;
  148.       }
  149.       else
  150.       {
  151.          subTotal += column[i];
  152.       }
  153.    }
  154. /* pass 2.. if multiple outputs, rank by number of outputs */
  155.    if (numOuts > 1)
  156.    {
  157.       printf ("relative importance of inputs per output PE...\n");
  158.       fprintf (f2, "relative importance of inputs per output PE...\n");
  159.       for (i=0; i < numOuts; i++)
  160.       {
  161.          printf ("output%4d\n", i+1);
  162.          fprintf (f2, "output%4d\n", i+1);
  163.          grandTotal = 0.0;
  164.          for (j=0; j < numIns; j++)
  165.             grandTotal += column[i+j*numOuts];
  166.          for (j=0; j < numIns; j++)
  167.          {
  168.             printf ("   input%4d %6.0f %6.1f%%\n",
  169.               j+1, column[i+j*numOuts], (column[i+j*numOuts]/grandTotal)*100.0);
  170.             fprintf (f2, "   input%4d %6.0f %6.1f%%\n",
  171.               j+1, column[i+j*numOuts], (column[i+j*numOuts]/grandTotal)*100.0);
  172.          }
  173.       }
  174.    }
  175.    fclose (f2);
  176.    printf ("Output file is nnrexpl.out.");
  177.    free (column);
  178.    exit (0);
  179. }
  180.